package pl.egraveyard.controller;

import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.validation.BindException;
import org.springframework.validation.Errors;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.SimpleFormController;

import pl.egraveyard.assembler.OsobaAssembler;
import pl.egraveyard.bo.UzytkownikBO;
import pl.egraveyard.command.RegisterCommand;
import pl.egraveyard.dao.SlMiejscowoscDao;
import pl.egraveyard.domain.SlMiejscowosc;
import pl.egraveyard.util.Constants;
import pl.egraveyard.util.Option;

/**
 * Kontroler dla okna rejestracji nowego uzytkownika
 * @author gunos
 *
 */
public class RegisterController extends SimpleFormController{
	private UzytkownikBO uzytkownikBO;
	private SlMiejscowoscDao slMiejscowoscDao;
	private OsobaAssembler uzytkownikAssembler;
	
	/**
	 * @param uzytkownikBO the uzytkownikBO to set
	 */
	public void setUzytkownikBO(UzytkownikBO uzytkownikBO) {
		this.uzytkownikBO = uzytkownikBO;
	}

	/**
	 * @param slMiejscowoscDao the slMiejscowoscDao to set
	 */
	public void setSlMiejscowoscDao(SlMiejscowoscDao slMiejscowoscDao) {
		this.slMiejscowoscDao = slMiejscowoscDao;
	}

	/**
	 * @param uzytkownikAssembler the uzytkownikAssembler to set
	 */
	public void setUzytkownikAssembler(OsobaAssembler uzytkownikAssembler) {
		this.uzytkownikAssembler = uzytkownikAssembler;
	}

	/**
	 * Domyslny konstruktor
	 */
	public RegisterController(){
		setCommandClass(RegisterCommand.class);
		setCommandName(Constants.CMD_OBJ);
		setFormView("/register");
		setSuccessView("/registration_complete");
	}
	
	/**
	 * {@inheritDoc}
	 */
	@Override
	protected Map<String, Object> referenceData(HttpServletRequest request, Object command,
			Errors errors) throws Exception {
		Map<String, Object> params = new HashMap<String, Object>();
		List<SlMiejscowosc> miejscowosci = slMiejscowoscDao.readAll();
		List<Option> miejscowosciOptions = new LinkedList<Option>();
		for(SlMiejscowosc miejscowosc : miejscowosci){
			miejscowosciOptions.add(new Option(miejscowosc.getNazwa(), miejscowosc.getKod()));
		}
		params.put(Constants.MIEJSCOWOSCI_REQ_PARAM, miejscowosciOptions);
		return params;
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	protected ModelAndView onSubmit(HttpServletRequest request,
			HttpServletResponse response, Object command, BindException errors)
			throws Exception {
		RegisterCommand cmd = (RegisterCommand) command;
		uzytkownikBO.createCustomer(uzytkownikAssembler.convertCmd2Customer(cmd));
		
		return new ModelAndView(getSuccessView(), new HashMap<String, Object>());
	}
	
}
